package main

// 继承和组合
/**
在 Go 语言中没有继承的概念，所以结构、接口之间也没有父子关系，Go 语言提倡的是组合，利用组合达到代码复用的目的，这也更灵活。
我同样以 Go 语言 io 标准包自带的接口为例，讲解类型的组合（也可以称之为嵌套），如下代码所示：
*/

type Reader interface {
	Read(p []byte) (n int, err error)
}

type Writer interface {
	Write(p []byte) (n int, err error)
}

//ReadWriter是Reader和Writer的组合
type ReadWriter interface {
	Reader
	Writer
}

/**
ReadWriter 接口就是 Reader 和 Writer 的组合，组合后，ReadWriter 接口具有 Reader 和 Writer 中的所有方法，这样新接口 ReadWriter 就不用定义自己的方法了，组合 Reader 和 Writer 的就可以了。
不止接口可以组合，结构体也可以组合，现在把 address 结构体组合到结构体 person 中，而不是当成一个字段，如下所示：
*/
type man struct {
	name  string
	age   uint
	brief string
	address
}

type address struct {
	province string
	city     string
	brief    string
}

//func main() {
//	// 组合后结构体的创建
//	// 1.无法通过编译
//	//ming := man{"王小明", 19, "北京", "北京"}
//	// 编译通过
//	ming := man{name: "王小明", age: 19,brief: "百变小樱", address: address{province: "北京", city: "北京",brief: "库洛里多"}}
//	fmt.Println(ming)
//	// 组合体字段是使用
//	// 外部类型可以直接.内部类型的字段和方法
//	fmt.Println(ming.city)
//	// 如果外部类型的字段和方法和内部的名称相同，则优先使用外部的
//	fmt.Println(ming.brief)  // 百变小樱
//}
